<?php
/**
 * Created by PhpStorm.
 * Author: Shadow
 * Date: 2022/1/7
 * Time: 10:28 上午
 * description: Type.php
 * 商品模型业务逻辑层
 */

namespace app\adminapi\business;


use app\common\model\Attribute;
use app\common\model\Spec;
use app\common\model\SpecValue;
use app\common\model\Type as TypeModel;
use think\exception\DbException;
use think\facade\Db;

class Type
{
    /**
     * 类型列表
     * @param int $limit
     * @param int $page
     * @return array
     * @throws \think\Exception
     */
    public static function getList($limit=10,$page=1){
        # 操作模型、获取数据
        return \app\common\model\Type::field('id,type_name')->paginate([
            'list_rows' => $limit,
            'page' => $page
        ])->toArray();
    }

    /**
     * 获取类型详情
     */
    public static function getInfo($id){
        # 模型关联 hasMany
        # type
        # 规格名 一对多
        # 规格值 一对多
        # 属性 一对多
        return TypeModel::with(['spec','spec.specValue','attr'])->find($id)->toArray();

    }

    /**
     * 添加类型
     * @param $params
     */
    public static function addType($params){
        # 处理规格以及属性中空格
        $data = [
            'type_name' => '手机',
            'spec' => [
                ['name' => '      ','value' =>['','']],# 都是规格名
                ['name' => '颜色','value' =>['白色','黑色','']],
                ['name' => '内存','value' =>['8+256','8+128']],
                ['name' => '颜色2','value' =>['','']],# 规格值为空
            ],
            'attr' => [
                ['name' => '重量','value' =>['0.6kg']],
                ['name' => '','value' =>['']],
                ['name' => '产品','value' =>['中国','上海']],
            ],
        ];
//        # 处理规格中的空字符串
//        foreach ($data['spec'] as $key => &$value) {
//            if (trim($value['name']) == '') {
//                unset($data['spec'][$key]);
//                # 下面的逻辑还执行
//                continue ;
//            }
//            # 处理规格值中的空字符串
//            foreach ($value['value'] as  $k => $item) {
//                if (trim($item) == '') {
//                    unset($value['value'][$k]);
//                }
//            }
//
//            # 如果有规格名称、但是没有规格值
//            if (count($value['value']) == 0) {
//                unset($data['spec'][$key]);
//            }
//        }
        # 第一调用、处理spec
        $data = handleTypeEmpty($data);
        # 第一调用、处理attr
        $data = handleTypeEmpty($data,'attr');
        // 启动事务 、数据一致性 事物 要么成功 、要么失败
        Db::startTrans();
        try {
            # 第一步、添加type save 添加一条记录
            $typeModel = new TypeModel();
            $result = $typeModel->save(['type_name' => $data['type_name']]);
            if (!$result) {
                return  fail(2001,'添加失败');
            }
            $type_id= $typeModel->id;
            # 第二步、添加规格名
            # 多个数据、批量添加 saveAll
//            [
//                ['spec_name' => '颜色','type_id' => 1],
//                ['spec_name' => '内存','type_id' => 1],
//            ];
            $addSpec = [];
            foreach ($data['spec'] as $item) {
                $addSpec[] = [
                    'spec_name' => $item['name'],
                    'type_id' => $type_id
                 ];
            }
            $specModel = new Spec();
            $returnSpec = $specModel->saveAll($addSpec);
            $returnSpec = $returnSpec->toArray();
            $returnSpec = array_column($returnSpec,'id','spec_name');
//            [
//                ['spec_id' => $spec_id,'spec_value' => '白色','type_id' => $type_id]
//            ]
            $addSpecValue = [];
            foreach ($data['spec'] as $spec) {
                foreach ($spec['value'] as $value) {
                    $addSpecValue[] = [
                        'spec_id'  => $returnSpec[$spec['name']],
                        'spec_value' => $value,
                        'type_id' => $type_id,
                    ];
                }
            }
            # 第三步、添加规格值
            $specValueModel = new SpecValue();
            $specValueModel->saveAll($addSpecValue);

            # 第四步、添加属性
//            [
//                ['attr_name' => "重量",'type_id' => $type_id,'attr_values' => '',],
//                ['attr_name' => "产地",'type_id' => $type_id,'attr_values' => '',],
//            ]
            $addAttr = [];
            foreach ($data['attr'] as $attr) {
                $addAttr[] = [
                    'attr_name' => $attr['name'],
                    'type_id' => $type_id,
                    'attr_values' => implode(',',$attr['value'])
                ];
            }
            $attrModel = new Attribute();
            $attrModel->saveAll($addAttr);
            // 提交事务
            Db::commit();
            return  success();
        }catch (DbException $exception) {
            // 回滚事务
            Db::rollback();
            return fail(2001,'添加');
        }



    }

    /**
     * 删除模型
     */
    public static function deleteType(){
        # 删除流程
        # 第一步 类型表
        # 第二步 规格
        # 第三步 规格值
        # 第四步 属性表
    }

}